package com.zmn.plat.dubbo.interfaces.pic;

import com.zmn.common.dto.AliyunOssStsDTO;
import com.zmn.common.dto.ResponseDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import java.io.File;
import java.io.InputStream;

/**
 * 阿里图片上传
 * 图片访问路经：https://img1.xiujiadian.com/dev/sm/order/04481230.jpg
 *
 * @author duanzuocai
 * @version v1.0
 * @since 2018/11/20 15:53
 */
@Api(value = "阿里图片上传服务", tags = {"阿里图片上传"})
public interface PicUploadRemoteService {

    /**
     * 上传文件
     *
     * @param directory 文件目录（公共约束：系统模块名 + 功能名称）
     * @param fileName  文件名
     * @param file      上传图片文件，超过3M会自动按默认大小压缩
     * @return
     */
    @ApiOperation(value = "上传文件", response = ResponseDTO.class, notes = "超过3M会自动按默认大小压缩", tags = {"上传"})
    ResponseDTO uploadPic(@ApiParam(value = "文件目录") String directory,
                          @ApiParam(value = "文件名") String fileName,
                          @ApiParam(value = "上传图片文件") File file);

    /**
     * 上传文件
     *
     * @param directory 文件目录（公共约束：系统模块名 + 功能名称）
     * @param fileName  文件名
     * @param file      上传图片文件，超过3M会自动按默认大小压缩
     * @param maxWidth  最大宽度：像素，可以为空，不限制大小
     * @param maxHeight 最大高度：像素，可以为空，不限制大小
     * @return
     */
    @ApiOperation(value = "上传文件", response = ResponseDTO.class, tags = {"上传"})
    ResponseDTO uploadPic(@ApiParam(value = "文件目录") String directory,
                          @ApiParam(value = "文件名") String fileName,
                          @ApiParam(value = "上传图片文件") File file,
                          @ApiParam(value = "最大宽度") Integer maxWidth,
                          @ApiParam(value = "最大高度") Integer maxHeight);

    /**
     * 描述: 上传文件 ip-限流
     *
     * @param directory  文件目录（公共约束：系统模块名 + 功能名称）
     * @param fileName   文件名
     * @param base64File 上传图片文件，bas64
     * @param maxWidth   最大宽度：像素，可以为空，不限制大小
     * @param maxHeight  最大高度：像素，可以为空，不限制大小
     * @return com.zmn.common.dto2.ResponseDTO<java.lang.String> 文件访问地址
     * @author wangjie
     * @since 2020/9/25 15:30
     **/
    @ApiOperation(value = "上传文件", response = com.zmn.common.dto2.ResponseDTO.class, tags = {"上传"})
    com.zmn.common.dto2.ResponseDTO<String> uploadPicLimiting(@ApiParam(value = "文件目录") String directory,
                                                              @ApiParam(value = "文件名") String fileName,
                                                              @ApiParam(value = "上传图片文件") String base64File,
                                                              @ApiParam(value = "最大宽度") Integer maxWidth,
                                                              @ApiParam(value = "最大高度") Integer maxHeight);

    /**
     * 上传文件
     *
     * @param directory 文件目录
     * @param fileName  文件名
     * @param bytes     上传图片文件-字节
     * @return
     */
    @ApiOperation(value = "上传文件", response = ResponseDTO.class, tags = {"上传"})
    ResponseDTO uploadPic(@ApiParam(value = "文件目录") String directory,
                          @ApiParam(value = "文件名") String fileName,
                          @ApiParam(value = "上传图片文件") byte[] bytes);

    /**
     * 上传文件
     *
     * @param directory 文件目录
     * @param fileName  文件名
     * @param bytes     上传图片文件-字节
     * @param maxWidth  最大宽度：像素，可以为空，不限制大小
     * @param maxHeight 最大高度：像素，可以为空，不限制大小
     * @return
     */
    @ApiOperation(value = "上传文件", response = ResponseDTO.class, tags = {"上传"})
    ResponseDTO uploadPic(@ApiParam(value = "文件目录") String directory,
                          @ApiParam(value = "文件名") String fileName,
                          @ApiParam(value = "上传图片文件") byte[] bytes,
                          @ApiParam(value = "最大宽度") Integer maxWidth,
                          @ApiParam(value = "最大高度") Integer maxHeight);

    /**
     * 描述：上传文件 - 不压缩
     *
     * @param directory   文件目录
     * @param fileName    文件名
     * @param inputStream 上传图片文件流
     * @return com.zmn.common.dto2.ResponseDTO<java.lang.Boolean>
     * @author wangjie
     * @since 2020/6/12 11:29
     **/
    @ApiOperation(value = "上传文件", response = com.zmn.common.dto2.ResponseDTO.class, tags = {"上传"})
    com.zmn.common.dto2.ResponseDTO<Boolean> uploadPicUnpressed(@ApiParam(value = "文件目录") String directory,
                                                                @ApiParam(value = "文件名") String fileName,
                                                                @ApiParam(value = "上传图片文件流") InputStream inputStream);

    /**
     * 描述：上传文件 - 不压缩
     *
     * @param directory 文件目录
     * @param fileName  文件名
     * @param bytes     上传图片文件-字节
     * @return com.zmn.common.dto2.ResponseDTO<java.lang.Boolean>
     * @author wangjie
     * @since 2020/6/12 11:29
     **/
    @ApiOperation(value = "上传文件", response = com.zmn.common.dto2.ResponseDTO.class, tags = {"上传"})
    com.zmn.common.dto2.ResponseDTO<Boolean> uploadPicUnpressed(@ApiParam(value = "文件目录") String directory,
                                                                @ApiParam(value = "文件名") String fileName,
                                                                @ApiParam(value = "上传图片文件") byte[] bytes);

    /**
     * 上传文件- 不压缩 (ip限流)
     *
     * @param directory 文件目录
     * @param fileName  文件名
     * @param bytes     上传图片文件-字节
     * @return com.zmn.common.dto2.ResponseDTO<java.lang.Boolean>
     */
    @ApiOperation(value = "上传文件- 不压缩 (ip限流)", response = com.zmn.common.dto2.ResponseDTO.class, tags = {"上传"})
    com.zmn.common.dto2.ResponseDTO<Boolean> uploadPicUnpressedLimiting(@ApiParam(value = "文件目录") String directory,
                                                                        @ApiParam(value = "文件名") String fileName,
                                                                        @ApiParam(value = "上传图片文件") byte[] bytes);

    /**
     * 获取图片 Url
     *
     * @param directory 文件目录
     * @param fileName  文件名
     * @return
     */
    @ApiOperation(value = "获取图片", response = String.class, tags = {"获取图片"})
    String getPicUrl(@ApiParam(value = "文件目录") String directory,
                     @ApiParam(value = "文件名") String fileName);

    /**
     * 获取文件上传临时权限
     *
     * @param serviceId 服务ID，用于统计
     * @return
     */
    @ApiOperation(value = "获取文件上传临时权限", response = String.class, tags = {"权限"})
    AliyunOssStsDTO getStsAuther(@ApiParam(value = "服务ID") String serviceId);
}
